#ifndef LOGMANAGER_H
#define LOGMANAGER_H


#include <QString>
#include <QObject>
#include <QtGlobal>
#include <QMutex>
#include "log_global.h"
#include "logger.h"
#include "loginfo.h"

#define LOGGER_DEFAULT -1 //默认日志

#define LOG_FILE_LINE //宏开关，默认记录文件名行号

#ifdef LOG_FILE_LINE //如果定义记录
#define LOG_TRACE(iCode) \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::TRACE) {} \
    else  LogManager::instance()->logger(iCode)->trace() << __FILE__ << '@' << __LINE__
#define LOG_DEBUG(iCode) \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::DEBUG) {} \
    else  LogManager::instance()->logger(iCode)->debug() << __FILE__ << '@' << __LINE__
#define LOG_INFO(iCode)  \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::INFO) {} \
    else  LogManager::instance()->logger(iCode)->info() << __FILE__ << '@' << __LINE__
#define LOG_WARN(iCode)  \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::WARN) {} \
    else  LogManager::instance()->logger(iCode)->warn() << __FILE__ << '@' << __LINE__
#define LOG_ERROR(iCode) \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::ERROR) {} \
    else  LogManager::instance()->logger(iCode)->error() << __FILE__ << '@' << __LINE__
#define LOG_FATAL(iCode) \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::FATAL) {} \
    else  LogManager::instance()->logger(iCode)->fatal() << __FILE__ << '@' << __LINE__
#else
#define LOG_TRACE(iCode) \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::TRACE) {} \
    else  LogManager::instance()->logger(iCode)->trace()
#define LOG_DEBUG(iCode) \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::DEBUG) {} \
    else  LogManager::instance()->logger(iCode)->debug()
#define LOG_INFO(iCode)  \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::INFO) {} \
    else  LogManager::instance()->logger(iCode)->info()
#define LOG_WARN(iCode)  \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::WARN) {} \
    else  LogManager::instance()->logger(iCode)->warn()
#define LOG_ERROR(iCode) \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::ERROR) {} \
    else  LogManager::instance()->logger(iCode)->error()
#define LOG_FATAL(iCode) \
    if(LogManager::instance()->logger(iCode)->logLevel() > Logging::FATAL) {} \
    else  LogManager::instance()->logger(iCode)->fatal()
#endif

class LOGSHARED_EXPORT LogManager
{
public:
    /************************************************
     * 功能：单例
     ************************************************/
    static LogManager* instance();

    /************************************************
     * 功能：添加日志（循环存储类型）
     * 输入参数：
     *      pInfo -- 日志文件文件配置
     * 返回：
     *      ERROR_NONE -- 成功
     *      其它 -- 失败
     ************************************************/
    Logging::ErrorCode addLogger( Logging::RotateConfigInfo* pInfo );

    /************************************************
     * 功能：添加日志（按时间存储类型）
     * 输入参数：
     *      pInfo -- 日志文件文件配置
     * 返回：
     *      ERROR_NONE -- 成功
     *      其它 -- 失败
     ************************************************/
    Logging::ErrorCode addLogger( Logging::TimeConfigInfo* pInfo );

    /************************************************
     * 功能：获取日志文件句柄
     * 输入参数：
     *      iCode -- 日志文件号
     * 返回：
     *      NULL -- 不存在
     *      其它 -- 配置文件句柄
     ************************************************/
    Logger* logger( int iCode = LOGGER_DEFAULT );
private:
    /************************************************
     * 功能：构造函数
     ************************************************/
    LogManager();

    /****************************
    功能： disable 拷贝
    *****************************/
    LogManager( const LogManager& );

    /****************************
    功能： disable 赋值
    *****************************/
    LogManager & operator = (const LogManager &);
    /************************************************
     * 功能：析构函数
     ************************************************/
    ~LogManager();
private:
    static QMap<int,Logger*> m_mapLoggers;//配置文件
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    static QMutex m_mutex; // Qt 5 使用 QMutex::Recursive
#else
    static QRecursiveMutex m_mutex; // Qt 6 使用 QRecursiveMutex
#endif
};

#endif // LOGMANAGER_H
